// 声明该类所在的包名，此包名为适配器相关包 
package com.example.myapplication01.chapter09.adapter;

// 导入Android上下文相关类，上下文用于获取应用程序的资源和类 
import android.content.Context;
// 导入布局填充器类，用于将布局文件转换为视图对象 
import android.view.LayoutInflater;
// 导入视图类，是所有UI组件的基类 
import android.view.View;
// 导入视图组类，是视图的容器类 
import android.view.ViewGroup;
// 导入基础适配器类，是所有适配器的基类，用于将数据绑定到视图上 
import android.widget.BaseAdapter;
// 导入图像视图类，用于显示图像 
import android.widget.ImageView;
// 导入文本视图类，用于显示文本 
import android.widget.TextView;

// 导入应用的资源类，用于访问应用中的资源，如布局、图片等 
import com.example.myapplication01.R;
// 导入行星实体类，该类定义了行星的相关属性 
import com.example.myapplication01.chapter09.entity.Planet;

// 导入列表接口，用于存储行星对象 
import java.util.List;

/**
 * 自定义的行星基础适配器类，继承自BaseAdapter，用于将行星数据绑定到列表视图上 
 */
public class PlanetBaseAdapter extends BaseAdapter {

    // 定义上下文对象，用于获取应用程序的资源和类 
    private Context mContext;
    // 定义行星列表，用于存储行星对象 
    private List<Planet> mPlaneList;

    /**
     * 构造函数，用于初始化适配器 
     * @param mContext 上下文对象，用于获取应用程序的资源和类 
     * @param mPlaneList 行星列表，存储行星对象 
     */
    public PlanetBaseAdapter(Context mContext, List<Planet> mPlaneList) {
        // 将传入的上下文对象赋值给成员变量 
        this.mContext = mContext;
        // 将传入的行星列表赋值给成员变量 
        this.mPlaneList = mPlaneList;
    }

    /**
     * 获取列表项的个数 
     * @return 行星列表的大小，即列表项的个数 
     */
    @Override
    public int getCount() {
        // 返回行星列表的大小 
        return mPlaneList.size();
    }

    /**
     * 获取指定位置的列表项对象 
     * @param position 列表项的位置 
     * @return 指定位置的行星对象
     */
    @Override
    public Object getItem(int position) {
        // 根据位置从行星列表中获取行星对象 
        return mPlaneList.get(position);
    }

    /**
     * 获取指定位置的列表项的ID 
     * @param position 列表项的位置 
     * @return 列表项的ID，这里直接返回位置作为ID 
     */
    @Override
    public long getItemId(int position) {
        // 返回列表项的位置作为ID 
        return position;
    }

    /**
     * 获取指定位置的列表项视图 
     * @param position 列表项的位置 
     * @param convertView 可复用的视图对象，如果为null则需要创建新的视图 
     * @param parent 父视图组 
     * @return 指定位置的列表项视图
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 定义视图持有者对象，用于存储视图中的控件 
        ViewHolder holder;
        // 判断可复用的视图对象是否为null 
        if (convertView == null) {
            // 如果为null，则使用布局填充器根据布局文件item_list.xml 生成转换视图对象 
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list,  null);
            // 创建视图持有者对象 
            holder = new ViewHolder();
            // 通过视图对象查找图像视图控件，并赋值给视图持有者的iv_icon属性 
            holder.iv_icon  = convertView.findViewById(R.id.iv_icon);
            // 通过视图对象查找文本视图控件（行星名称），并赋值给视图持有者的tv_name属性 
            holder.tv_name  = convertView.findViewById(R.id.tv_name);
            // 通过视图对象查找文本视图控件（行星描述），并赋值给视图持有者的tv_desc属性 
            holder.tv_desc  = convertView.findViewById(R.id.tv_desc);
            // 将视图持有者保存到转换视图当中，以便复用 
            convertView.setTag(holder);
        } else {
            // 如果可复用的视图对象不为null，则从转换视图中获取视图持有者对象 
            holder = (ViewHolder) convertView.getTag();
        }

        // 根据位置从行星列表中获取行星对象 
        Planet planet = mPlaneList.get(position);
        // 给图像视图控件设置行星的图片资源 
        holder.iv_icon.setImageResource(planet.image);
        // 给文本视图控件（行星名称）设置行星的名称 
        holder.tv_name.setText(planet.name);
        // 给文本视图控件（行星描述）设置行星的描述 
        holder.tv_desc.setText(planet.desc);

        // 返回转换视图对象 
        return convertView;
    }

    /**
     * 视图持有者类，用于存储列表项视图中的控件，提高性能 
     */
    public final class ViewHolder {
        // 定义图像视图控件，用于显示行星的图片 
        public ImageView iv_icon;
        // 定义文本视图控件，用于显示行星的名称 
        public TextView tv_name;
        // 定义文本视图控件，用于显示行星的描述 
        public TextView tv_desc;
    }
} 